package com.baseballgame.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/**
 * 통신하는 소켓 클래스
 * ListeningThread에서 받은 소켓을 여기서 사용해야 한다.
 * 메세지를 받거나 보내는 클래스
 */
public class ServerNetUnit extends Thread {

	private ServerChatFrame frame;//Frame에 대한 참조
	
	private Socket socket;
	private BufferedReader breader;//Text로 이동하기 때문에 이 클래스 사용함
	private PrintStream pstream;
	private boolean running;
	
	public ServerNetUnit(ServerChatFrame frame, Socket socket) throws IOException{
		//try ~ catch 써서 오류를 처리해도 의미가 없기 때문에 throws로 처리한 코드
		this.frame = frame;
		this.socket = socket;
		breader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		pstream = new PrintStream(socket.getOutputStream());
	}
	
	@Override
	public void run(){
		running = true;
		while(running){
			//메시지 수신 처리 -> 소켓이 필요함
			try{
				//available() : 수신된 메시지의 데이터 양을 반환
				if(socket.getInputStream().available() > 0){
					String line = breader.readLine();
					String[] rule = new String[3];
					if(line.indexOf(",") > -1){
						rule = line.split(",");
						
						frame.processConnect(rule[0], rule[1], rule[2]);
					}else{
						rule[0] = line.substring(0, 1);
						rule[1] = line.substring(1, 2);
						rule[2] = line.substring(2, 3);
						
						frame.processConnect(this, rule[0], rule[1], rule[2]);
					}
					
					//수신된 메시지 처리
					//frame.processMessage(this, line);
				}else {
					Thread.sleep(10);
				}
			}catch(Exception e){
				running = false;
				doClose();
				e.printStackTrace();
			}
		}
	}
	
	public void doSend(String message){
		System.out.println("!!!");
		pstream.println(message);
		pstream.flush();
	}
	
	public void doStop(){
		running = false;
		
		doClose();
	}

	private void doClose() {
		try{ breader.close(); } catch(Exception e){}
		try{ pstream.close(); } catch(Exception e){}
		try{ socket.close(); } catch(Exception e){}
	}
	
	public String getClientName(){
		return socket.getRemoteSocketAddress().toString();
	}
}
